package com.example.application4.util;

import android.content.Context;
import android.content.SharedPreferences;

import com.example.application4.pojo.Diary;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class SharedPreferencesManager {

    // 定义SharedPreferences文件的基本名称
    private static final String PREF_NAME_BASE = "DiaryPreferences_";
    // 定义存储日记条目的键名
    private static final String KEY_DIARY_ENTRIES = "diary_entries";
    // 创建Gson实例
    private static final Gson gson = new Gson();

    /**
     * 根据用户名获取SharedPreferences实例
     * @param context 应用上下文
     * @param username 用户名
     * @return 返回一个特定于用户的SharedPreferences实例
     */
    private static SharedPreferences getSharedPreferences(Context context, String username) {
        String prefName = PREF_NAME_BASE + username;
        return context.getSharedPreferences(prefName, Context.MODE_PRIVATE);
    }

    /**
     * 将日记条目保存到特定用户的SharedPreferences中
     * @param context 应用上下文
     * @param username 用户名
     * @param diary 要保存的日记对象
     */
    public static void saveDiaryEntry(Context context, String username, Diary diary) {
        if (context == null || username == null || diary == null) {
            throw new IllegalArgumentException("参数不能为空"); // 添加参数检查
        }

        List<Diary> diaries = getDiaryEntries(context, username);
        diaries.add(diary);

        String jsonDiaries = gson.toJson(diaries);
        getSharedPreferences(context, username).edit()
                .putString(KEY_DIARY_ENTRIES, jsonDiaries)
                .apply();
    }

    /**
     * 从特定用户的SharedPreferences中获取所有日记条目
     * @param context 应用上下文
     * @param username 用户名
     * @return 返回特定用户的日记条目的列表
     */
    public static List<Diary> getDiaryEntries(Context context, String username) {
        SharedPreferences prefs = getSharedPreferences(context, username);
        String jsonDiaries = prefs.getString(KEY_DIARY_ENTRIES, null);
        if (jsonDiaries == null) {
            Diary.DEFAULT_ID = 0;
            return new ArrayList<>();
        }

        Type diaryListType = new TypeToken<ArrayList<Diary>>() {}.getType();
        List<Diary> diaries = gson.fromJson(jsonDiaries, diaryListType);
        Diary.DEFAULT_ID = diaries.size();
        return diaries;
    }

    /**
     * 删除特定用户的SharedPreferences文件中的特定日记
     * @param context 应用上下文
     * @param username 用户名
     * @param id 日记id
     */
    public static void removeDiaryEntry(Context context, String username, int id) {
        if (context == null || username == null || id < 0) {
            throw new IllegalArgumentException("参数不能为空");
        }
        List<Diary> diaries = getDiaryEntries(context, username);
        for (Diary diary : diaries) {
            if (diary.getId() == id) {
                diaries.remove(diary);
                break;
            }
        }

        String jsonDiaries = gson.toJson(diaries);
        clearDiaryEntries(context, username);
        getSharedPreferences(context, username).edit()
                .putString(KEY_DIARY_ENTRIES, jsonDiaries)
                .apply();
    }

    /**
     * 从特定用户的SharedPreferences中移除所有日记条目
     * @param context 应用上下文
     * @param username 用户名
     */
    public static void clearDiaryEntries(Context context, String username) {
        if (context == null || username == null) {
            throw new IllegalArgumentException("参数不能为空");
        }

        getSharedPreferences(context, username).edit()
                .remove(KEY_DIARY_ENTRIES)
                .apply();
    }
}
